package io.yx.flx.task;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.cron.CronUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import io.vertx.ext.web.handler.BodyHandler;
import io.yx.flx.Main;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.util.List;

/**
 * 磁盘空间占用监控，当超过指定的占用量的时候释放一些存储的文件
 */
public class DiskMonitor {

    private static final File uploadDir = new File(Main.getBasePath() + File.separator + BodyHandler.DEFAULT_UPLOADS_DIRECTORY);

    private static final Log log = LogFactory.get();

    private static final int MaxCacheSize = Main.setting.getInt("diskFileMaxSize", 20);// 最大文件缓存大小G
    private static final int days = Main.setting.getInt("dropFileOffsetDays", 30);// 超过多少天就删除

//    public static void main(String[] args) throws IOException {
//        if (sizeOverflow()) {
//            dropOldFile();
//        }
//    }

    public static void cacheClean() {
        // 每小时统计文件大小
        CronUtil.schedule("0 0 * * * ?", (Runnable) () -> {
            if (sizeOverflow()) {
                ThreadUtil.sleep(100);
                // 删除旧文件,删完文件再次判断是否超出
                dropOldFile();
            }
        });

        CronUtil.setMatchSecond(true);
        CronUtil.start(true);
    }

    private static void dropOldFile() {

        List<File> files = FileUtil.loopFiles(uploadDir);
        for (File file : files) {
            try {
                BasicFileAttributes basicFileAttributes = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
                FileTime fileTime = basicFileAttributes.lastModifiedTime();
                long l = fileTime.toMillis();//
                DateTime lastModifyDate = DateUtil.date(l);
                long offsetDay = lastModifyDate.between(DateUtil.date(), DateUnit.DAY);
                if (offsetDay > days) {// 超过30天的删除
                    log.info("删除文件:{}", file.getAbsolutePath());
                    FileUtil.del(file);
                }
            } catch (IOException ignore) {
            }
        }
    }


    /**
     * 是否超过设定的文件大小
     *
     * @return
     */
    public static boolean sizeOverflow() {

        long fileUsedSize = FileUtil.size(uploadDir);
        // 将G转化为字节byte，1G=1024M 1M=1024K 1K=1024B
        if (fileUsedSize > (long) MaxCacheSize * 1024 * 1024 * 1024) {//
            // 文件夹大小已超过MaxCacheSize
            log.info("文件夹超过指定大小{},cacheSize:{}", MaxCacheSize, FileUtil.readableFileSize(fileUsedSize));
            return true;
        } else {
            log.debug("空间充足!fileUsedSize:{}", FileUtil.readableFileSize(fileUsedSize));
        }
        return false;

    }


}
